package br.com.findme.findmeserver.entidade;

import java.io.Serializable;
import java.lang.reflect.Type;

import javax.persistence.*;

import br.com.findme.findmeserver.entidade.Usuario;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;


/**
 * The persistent class for the T_USUARIO database table.
 * 
 */
@Entity
@Table(name="T_USUARIO")
public class Usuario implements Serializable {
	private static final long serialVersionUID = 1L;
	private int id;
	private Timestamp dataAceite;
	private Timestamp dataCadastro;
	private String email;
	private String fone;
	private String nome;
	private String senha;
	private List<Localizacao> localizacoes = new ArrayList<Localizacao>();
	private List<Mensagem> mensagens;
	
	private List<Grupo> grupos = new ArrayList<Grupo>();
	private List<Grupo> gruposLiderados = new ArrayList<Grupo>();
	

	public Usuario() {
	}


	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	public int getId() {
		return this.id;
	}

	public void setId(int id) {
		this.id = id;
	}


	@Column(name="DATA_ACEITE")
	public Timestamp getDataAceite() {
		return this.dataAceite;
	}

	public void setDataAceite(Timestamp dataAceite) {
		this.dataAceite = dataAceite;
	}


	@Column(name="DATA_CADASTRO")
	public Timestamp getDataCadastro() {
		return this.dataCadastro;
	}

	public void setDataCadastro(Timestamp dataCadastro) {
		this.dataCadastro = dataCadastro;
	}


	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}


	public String getFone() {
		return this.fone;
	}

	public void setFone(String fone) {
		this.fone = fone;
	}


	public String getNome() {
		return this.nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}


	public String getSenha() {
		return this.senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}


	//bi-directional many-to-one association to Localizacao
	@OneToMany(mappedBy="usuario")
	public List<Localizacao> getLocalizacoes() {
		return this.localizacoes;
	}

	public void setLocalizacoes(List<Localizacao> localizacoes) {
		this.localizacoes = localizacoes;
	}


	//bi-directional many-to-one association to Mensagem
	@OneToMany(mappedBy="usuario")
	public List<Mensagem> getMensagens() {
		return this.mensagens;
	}

	public void setMensagens(List<Mensagem> mensagens) {
		this.mensagens = mensagens;
	}

	
	@ManyToMany(mappedBy="usuarios")
	public List<Grupo> getGrupos() {
		return grupos;
	}


	public void setGrupos(List<Grupo> grupos) {
		this.grupos = grupos;
	}

	@OneToMany(mappedBy="usuario")
	public List<Grupo> getGruposLiderados() {
		return gruposLiderados;
	}


	public void setGruposLiderados(List<Grupo> gruposLiderados) {
		this.gruposLiderados = gruposLiderados;
	}


	public static JsonSerializer<Usuario> toJSON(){
		
		return new JsonSerializer<Usuario>(){

			@Override
			public JsonElement serialize(Usuario usuario, Type type, JsonSerializationContext context) {				
				JsonObject jsonObject = new JsonObject();
		        jsonObject.addProperty("id", usuario.getId());
		        jsonObject.addProperty("nome", usuario.getNome());
		        jsonObject.addProperty("email", usuario.getEmail());
		        jsonObject.addProperty("fone", usuario.getFone());		        
		        jsonObject.addProperty("dataCadastro", usuario.getDataCadastro().toString());
		        if(usuario.getDataAceite() != null)
		        	jsonObject.addProperty("dataAceite", usuario.getDataAceite().toString());
		        jsonObject.addProperty("senha", usuario.getSenha());		        
		        return jsonObject;			
		     }			
		};
		
	}

}